package com.ruoyi.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.domain.po.Interview;
import com.ruoyi.mapper.InterviewMapper;
import com.ruoyi.service.IInterviewService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 描述：面经表 服务实现类
 * @author 杨宸
 * @since 2025-02-12
 */
@Service
@Slf4j
public class InterviewServiceImpl extends ServiceImpl<InterviewMapper, Interview> implements IInterviewService {

    /**
     * 描述：分页查询
     * @author 杨宸
     * @date 2025-02-12
     */
    @Override
    public IPage<Interview> pageList(Interview interview) {
        int current = interview.getCurrent();
        int size = interview.getSize();
        Page<Interview> pageVo = lambdaQuery().page(new Page<>(current, size));
        handlePageList(pageVo);
        return pageVo;
    }
    
     /**
      * 描述：详情
     * @author 杨宸
     * @date 2025-02-12
      */
     @Override
     public Interview detailInterview(Long id) {
         Interview interview = getById(id);
         handleDetailInterview(interview);
         return interview;
     }   

    /**
     * 描述：保存
     * @author 杨宸
     * @date 2025-02-12
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void saveInterview(Interview interview) {
        try {
            // 1. 参数校验
            checkSaveInterview(interview);
            // 2. 处理参数
            handleSaveInterview(interview);
            // 3. 保存
            save(interview);
            // 4. 若保存牵涉其他表, 则处理
            saveOther(interview);
        } catch (Exception e) {
            log.error("保存失败！", e);
            throw new RuntimeException("保存失败！");
        }
    }

    /**
     * 描述：修改
     * @author 杨宸
     * @date 2025-02-12
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void updateInterview(Interview interview) {
        try {
            // 1. 参数校验
            checkUpdateInterview(interview);
            // 2. 处理参数
            handleUpdateInterview(interview);
            // 3. 修改
            saveOrUpdate(interview);
            // 4. 若保存牵涉其他表, 则处理
            updateOther(interview);
        } catch (Exception e) {
            log.error("修改失败！", e);
            throw new RuntimeException("修改失败！");
        }
    }

    /**
     * 描述：删除
     * @author 杨宸
     * @date 2025-02-12
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void deleteInterview(List<Long> ids) {
        if (CollectionUtil.isNotEmpty(ids)) {
            try {
                deleteOther(ids);
                removeBatchByIds(ids);
            } catch (Exception e) {
                log.error("删除失败！", e);
                throw new RuntimeException("删除失败！");
            }
        }
    }

    /**
     * 描述：导出
     * @author 杨宸
     * @date 2025-02-12
     */
    @Override
    public void exportExcel(HttpServletResponse response, Interview interview) {
        ExcelUtil<Interview> util = new ExcelUtil<>(Interview.class);
        IPage<Interview> pageVo = pageList(interview);
        if (pageVo == null) {
            throw new RuntimeException("导出失败！");
        }
        util.exportExcel(response, pageVo.getRecords(), "数据列表");
    }

    /**
     * 描述：查询结果进行封装
     * @author 杨宸
     * @date 2025-02-12
     */
    private void handlePageList(Page<Interview> pageVo) {
        // 如果有查询结果需要进行封装, 请在这个写逻辑, 并去掉注释.
    }
    
    /**
     * 描述：对详情结果进行封装
     * @author cymal
     * @date 2024-03-24
     */
    private void handleDetailInterview(Interview interview) {
        // 如果有查询结果需要进行封装, 请在这个写逻辑, 并去掉注释.
    }    

    /**
     * 描述：保存前置校验
     * @author 杨宸
     * @date 2025-02-12
     */
    private void checkSaveInterview(Interview interview) {
        // 如果有参数校验, 请在这个写逻辑, 并去掉注释.
    }

    /**
     * 描述：保存前置参数处理
     * @author 杨宸
     * @date 2025-02-12
     */
    private void handleSaveInterview(Interview interview) {
        // 如果有参数需要二次处理, 请在这个写逻辑, 并去掉注释.
    }

    /**
     * 描述：保存后处理其他表
     * @author 杨宸
     * @date 2025-02-12
     */
    private void saveOther(Interview interview) {
        // 如果有对其他表的操作, 请在这个写逻辑, 并去掉注释.
    }

    /**
     * 描述：修改前置校验
     * @author 杨宸
     * @date 2025-02-12
     */
    private void checkUpdateInterview(Interview interview) {
        // 如果有参数校验, 请在这个写逻辑, 并去掉注释.
    }

    /**
     * 描述：修改前置参数处理
     * @author 杨宸
     * @date 2025-02-12
     */
    private void handleUpdateInterview(Interview interview) {
        // 如果有参数需要二次处理, 请在这个写逻辑, 并去掉注释.
    }

    /**
     * 描述：修改后处理其他表
     * @author 杨宸
     * @date 2025-02-12
     */
    private void updateOther(Interview interview) {
        // 如果有对其他表的操作, 请在这个写逻辑, 并去掉注释.
    }

    /**
     * 描述：修改后处理其他表
     * @author 杨宸
     * @date 2025-02-12
     */
    private void deleteOther(List<Long> ids) {
        // 如果有对其他表的操作, 请在这个写逻辑, 并去掉注释.
    }

}